package com.deliccio.service.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.deliccio.dao.ColumnaDAO;
import com.deliccio.dao.EstadosgeneralesDAO;
import com.deliccio.dao.FotoDAO;
import com.deliccio.dao.GridDAO;
import com.deliccio.dao.MesaDAO;
import com.deliccio.dao.SucursalesDAO;
import com.deliccio.dao.UsuarioPorSucursalDAO;
import com.deliccio.entitys.Columna;
import com.deliccio.entitys.Estadosgenerales;
import com.deliccio.entitys.Foto;
import com.deliccio.entitys.Grid;
import com.deliccio.entitys.Mesa;
import com.deliccio.entitys.Sucursales;
import com.deliccio.entitys.Usuario;
import com.deliccio.service.MantenimientoMesasService;
import com.deliccio.util.BeanConsulta;
import com.deliccio.util.Constantes;
import com.deliccio.util.Util;

@Service("MantenimientoMesasService")
public class MantenimientoMesasServiceImpl implements MantenimientoMesasService{

	
	@Autowired
	private GridDAO gridDAO;
	
	@Autowired
	private MesaDAO mesaDAO;

	@Autowired
	private FotoDAO fotoDAO;
	
	@Autowired
	private UsuarioPorSucursalDAO usuarioPorSucursalDAO;
	
	@Autowired
	private EstadosgeneralesDAO estadosgeneralesDAO;
	
	@Autowired
	private SucursalesDAO sucursalesDAO;
	
	@Autowired
	private ColumnaDAO columnaDAO;
	
	@Override
	public Map<String,Object> obtenerDataMesas(
			Usuario usuario,int codGrid,String sidx,String sord,int page,int rows,
			boolean _search,String searchField,String searchOper,String searchString){	
		int idsucursal = usuarioPorSucursalDAO.getSucursal(usuario);
	    List<BeanConsulta> consultas=new ArrayList<BeanConsulta>();
		if(idsucursal > 0){
			consultas.add(new BeanConsulta("sucursales.id","sucursal", idsucursal,true));
		}
		BeanConsulta[] bconsul=consultas.toArray(new BeanConsulta[0]);
		Grid grid=	gridDAO.get(codGrid);
		List<Columna> columnas=columnaDAO.obtenerporGrid(grid);
		grid.setColumnaList(columnas);
		
		if(grid!=null){
			if(grid.getColumnaList()!=null && grid.getColumnaList().size()>0){
				Map<String,Object> objeto=new HashMap<String,Object>();				
				//int count = gridDAO.getCantidadDataRows(grid,usuario,codGrid,sidx,sord,page,rows,_search,searchField,searchOper,searchString, bconsul);
				int count = gridDAO.getCantidadDataRows(grid,usuario,codGrid,sidx,sord,page,rows,_search,searchField,searchOper,searchString);				
				int total=0;
				int records=0;
				if(count>0){
					total=count/rows+1;
				}
				List<Map<String,Object>> data=gridDAO.getData(grid, usuario, codGrid, sidx, sord, page, rows, _search, searchField, searchOper, searchString, bconsul);
				//	List<Map<String,Object>> data=gridDAO.getData(grid,usuario,codGrid,sidx,sord,page,rows,_search,searchField,searchOper,searchString);
				objeto.put("page",page);
				objeto.put("total",total);
				if(data!=null){
					records=data.size();
				}			
				objeto.put("records",records);
				objeto.put("data",data);				
				return objeto;
			}
		}
		return null;
	}

	@Override
	public Grid obtenerGridporCod(Integer cod){
		Grid g=gridDAO.obtenerPorCodigoTabla(cod);
		List<Columna> columnas=columnaDAO.obtenerporGrid(g);
		g.setColumnaList(columnas);	
		return g;
	}

	@Override
	public List<Mesa> obtenerMesaPorSucursal(int idsucursal) {
		return mesaDAO.obtenerMesaPorSucursal(idsucursal);
	}

	@Override
	public Mesa buscarMesa(int idmesa) {
		return mesaDAO.buscarxId(idmesa);
	}

	@Override
	@Transactional
	public int guardarMesa(Mesa mesa,int x, int y, int w, int h,
			String fileRuta, String nameImage, String formato, int width, int height, HttpServletRequest request) {	
		try {
			String rutaNueva=Constantes.ROOT_ROSOURCES +Constantes.ROOT_IMAGES +Constantes.ROOT_SLASH +Constantes.ROOT_FOL_MESA;
			nameImage=Util.generarCodigo("mesa",nameImage);
			int result=Util.guardarImagen(x,y,w,h,fileRuta,nameImage,rutaNueva,formato,width,height,request);
		
			if(result>0){
				Foto foto = mesa.getFoto();
		    	Foto f=null;
		    	if(mesa.getFoto().getId()==null){
		    		f= new Foto(nameImage,rutaNueva,Constantes.ROOT_FOL_MESA,nameImage);
		    	}else{
		    		f=fotoDAO.get(foto.getId());
		    		f.setCarpeta(foto.getCarpeta());
		    		f.setCodigo(foto.getCodigo());
		    		f.setNombre(foto.getNombre());
		    		f.setRuta(foto.getRuta());			    	
		    	}
		    	fotoDAO.guardar(f);
		    	mesa.setFoto(f);
		    	
		    	Mesa m = mesaDAO.get(mesa.getId());
		    	
				if (m==null){
					m = new Mesa();
					m.setCantidadpersonas(mesa.getCantidadpersonas());
					m.setNumero(mesaDAO.generarNumero(mesa.getSucursales().getId()));
					m.setEstadosgenerales(new Estadosgenerales(1));
					m.setFoto(mesa.getFoto());					
					m.setSucursales(mesa.getSucursales());
					    		
		    	}else{		    		
		    		m.setCantidadpersonas(mesa.getCantidadpersonas());
		    		m.setNumero(mesa.getNumero());
		    		m.setEstadosgenerales(mesa.getEstadosgenerales());
		    		m.setFoto(mesa.getFoto());
		    		m.setSucursales(mesa.getSucursales());

		    	}
				mesaDAO.guardar(m);		
			
			}			
		
		}catch (Exception e) {

		}
		return 1;
	}

	@Override
	public String guardarImagenTemporal(MultipartFile archivoSubir,
			HttpServletRequest request) throws IOException, Exception {
		return Util.guardarImagenTemporal(archivoSubir, request);
	}

	@Override
	public List<Sucursales> obtenerSucursales(){
		return sucursalesDAO.obtenerSucursales();
	}

	@Override
	public List<Estadosgenerales> obtenerEstado() {
		return estadosgeneralesDAO.obtenerEstadoPorTabla(Constantes.ESTADOS_MESAS);
	}

	@Override
	public int obtenernumero(int idsucursal) {		
		return mesaDAO.generarNumero(idsucursal);
	}

	@Override
	public Foto buscarFoto(Foto foto, HttpServletRequest request) {
		String fileName=request.getRealPath("") + foto.getRuta()+ Constantes.ROOT_SLASH + foto.getNombre();
		foto.setIntWith(Util.getWithImagen(fileName));
		foto.setIntHeight(Util.getHeightImagen(fileName));		
		String ext=fileName.substring(fileName.lastIndexOf(".") + 1,fileName.length()).trim().toLowerCase();
		foto.setStrformato(ext);
		return foto;
	}

}
